package com.example.demo.repository;

import com.example.demo.entity.OrderEntity;
import com.example.demo.enums.OrderStatusEnum;
import com.example.demo.enums.OrderTypeEnum;
import com.example.demo.enums.PaymentMethodEnum;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 订单数据访问层
 * 
 * 演示功能：
 * 1. 使用枚举作为查询参数，框架自动转换为数据库字段值
 * 2. 方法签名清晰，类型安全
 * 3. 无需手动转换枚举和数据库值
 */
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
    
    /**
     * 根据订单编号查找订单
     */
    Optional<OrderEntity> findByOrderNo(String orderNo);
    
    /**
     * 根据用户ID查找订单
     */
    List<OrderEntity> findByUserIdOrderByCreatedTimeDesc(Long userId);
    
    /**
     * 根据订单状态查找订单 - 枚举参数自动转换
     */
    List<OrderEntity> findByStatus(OrderStatusEnum status);
    
    /**
     * 根据订单状态分页查询 - 枚举参数自动转换
     */
    Page<OrderEntity> findByStatus(OrderStatusEnum status, Pageable pageable);
    
    /**
     * 根据订单类型查找订单 - 枚举参数自动转换
     */
    List<OrderEntity> findByType(OrderTypeEnum type);
    
    /**
     * 根据支付方式查找订单 - 枚举参数自动转换
     */
    List<OrderEntity> findByPaymentMethod(PaymentMethodEnum paymentMethod);
    
    /**
     * 根据用户ID和订单状态查找订单 - 多个枚举参数
     */
    List<OrderEntity> findByUserIdAndStatus(Long userId, OrderStatusEnum status);
    
    /**
     * 根据订单状态列表查找订单 - 枚举集合参数
     */
    List<OrderEntity> findByStatusIn(List<OrderStatusEnum> statuses);
    
    /**
     * 统计指定状态的订单数量 - 枚举参数自动转换
     */
    long countByStatus(OrderStatusEnum status);
    
    /**
     * 统计指定用户的订单数量
     */
    long countByUserIdAndStatus(Long userId, OrderStatusEnum status);
    
    /**
     * 查找指定时间范围内的订单
     */
    List<OrderEntity> findByCreatedTimeBetween(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 自定义查询：查找待处理的订单
     * 演示在JPQL中使用枚举参数
     */
    @Query("SELECT o FROM OrderEntity o WHERE o.status IN :statuses AND o.createdTime < :beforeTime")
    List<OrderEntity> findPendingOrders(
            @Param("statuses") List<OrderStatusEnum> statuses, 
            @Param("beforeTime") LocalDateTime beforeTime
    );
    
    /**
     * 自定义查询：统计各状态订单数量
     * 演示返回枚举值的统计查询
     */
    @Query("SELECT o.status, COUNT(o) FROM OrderEntity o GROUP BY o.status")
    List<Object[]> countByStatusGroup();
    
    /**
     * 自定义查询：查找需要自动取消的订单
     */
    @Query("SELECT o FROM OrderEntity o WHERE o.status = :pendingStatus AND o.createdTime < :expireTime")
    List<OrderEntity> findExpiredPendingOrders(
            @Param("pendingStatus") OrderStatusEnum pendingStatus,
            @Param("expireTime") LocalDateTime expireTime
    );
}
